#include "client_merchant.h"
#include "database.h"
#include "log.h"

//商家 查看未读消息
NOREAD view_noread_msg_shangjia(int fd){
    MSG msg = {0 };
    msg.type = _view_chat_noread_shangjia;
    memcpy(msg.data,currentLoginUserName,sizeof(currentLoginUserName));
    
    send(fd , &msg , sizeof(msg) ,0);
    recv(fd , &msg , sizeof(msg) , 0);
    printf("%s\n",msg.data);
    // 解析响应数据
    NOREAD a;
    if (sscanf(msg.data, "siliao=%d qunliao=%d", &a.siliao, &a.qunliao) != 2) {
        ERROR("无法解析服务器响应: %s\n", msg.data);
        a.siliao = 0;
        a.qunliao = 0;
    }
    return a;
}

//商家登录界面
void merchant_menu(int fd){
    //查看未读消息
    NOREAD a =  view_noread_msg_shangjia( fd);

    while (1)
    {
        printf("-------------登录成功 欢迎使用-----------\n");
        printf("1.添加商品 2.删除商品 3.修改商品 4.查询所有商品 5.和消费者沟通（发私聊 也可以收群聊）(%d) 6.创建群聊 7.进入群聊 8.退出\n",a.siliao);
    
        int chang;
        printf("请输入选项\n");
        scanf("%d",&chang);
        while(getchar() != '\n');

        switch (chang)
        {
        case 1:
            //商品 增 
            merchant_add_product(fd);
            break;
        case 2:
            //商品  删 
            merchant_del_product(fd);
            break;
        case 3:
            //商品  改
            merchant_change_product(fd);
            break;
        case 4:
            //商品  查
            merchant_find_product(fd);
            break;
        case 5:
            //聊天 私聊
            single_ChatFun(fd);
            break;
        case 6:
            //创建群聊
            merchant_creat_group(fd);
            break;
        case 7:
            //进入群聊
            merchant_inset_group(fd);
            break;
        case 8://退出
            printf("已退出\n");
            exit(0);
            break;
        default:
        printf("请按照指示输入\n");
            break;
        }
    }
    
}
//聊天用的线程
void *read_Chat(void *pData)
{
     int fd = *(int *)pData; // 还原套接字
     while (1)
     {
          MSG msg;
          // 接受群聊消息
          recv(fd, &msg, sizeof(msg), 0);
          if(msg.type == groupChat)
          {
              printf("收到群聊消息：%s\n", msg.data); 
          }
          //else
           if(msg.type == singleChat)
          {
               SC * pSC = (SC *)msg.data;
               printf("%s发来消息，内容是：%s\n",pSC->self,pSC->text);
          }
          else if(msg.type == _msgChar)
          {
               SC * pSC = (SC *)msg.data;
               printf("用户 %s发来消息，内容是：%s\n",pSC->self,pSC->text);
           

          }
     }
}

//创建群聊
void merchant_creat_group(int fd){
    MSG msg = {0};
    msg.type = _merchant_creat_group;
    //请输入群聊的名字 然后发送一个 创建群聊的 消息给 服务器 
    // 获取用户输入的群聊名字

    SC sc;//私聊的结构体
    strcpy(sc.self,currentLoginUserName);//把当前登录的用户作为发送方
    printf("请输入群聊的名字（注意不能和已有的群名重复）:\n");
    scanf("%s",sc.dest);//填写对方的名字 服务器就在 用户的 表中找对应的套接字
    
    
    memcpy(msg.data,&sc,sizeof(sc));//把填好的 结构体拷贝到消息结构体中
    
    //服务器操作数据库 在聊天表中添加 一列名 作为群 创建成功返回一个消息 失败返回一个消息
    // 发送请求给服务器
        send(fd, &msg, sizeof(msg), 0);

        // 接收响应
        recv(fd, &msg, sizeof(msg), 0);
        if(msg.type == _yes){
            printf("创建群聊成功\n");

        }
        else{
            printf("创建群聊失败 原因是%s\n ",msg.data);
        }
        


}
//进入群聊
void merchant_inset_group(int fd){

}

//商家会 顾客 私聊实现函数
void single_ChatFun(int fd)
{
     pthread_t pt;
     pthread_create(&pt, NULL, read_Chat, &fd); // 创建一个接收聊天信息用的线程

     while (1)
     {
          SC sc;//私聊的结构体
          strcpy(sc.self,currentLoginUserName);//把当前登录的用户作为发送方
          printf("请输入对方的名字:\n");
          scanf("%s",sc.dest);//填写对方的名字 服务器就在 用户的 表中找对应的套接字
          printf("请输入聊天的内容:\n");
          scanf("%s",sc.text);

          MSG msg;
          msg.type = _merchant_guke_chat;
          memcpy(msg.data,&sc,sizeof(sc));//把填好的私聊结构体拷贝到消息结构体中
          send(fd,&msg,sizeof(msg),0);//把带有私聊信息的结构体发给服务器

          if (strcmp(sc.text, "quit") == 0) // 如果用户输入quit，说明想退出聊天
          {
               pthread_cancel(pt); // 关闭接受聊天信息用的线程，避免它接受走了其它不想管的消息
               break;
          }
     }
     //这里应该要写一个recv去接受服务器的返回，判断是否发送成功了
}
//商家添加商品
void merchant_add_product(int fd){
    printf("请输入商品的信息（商家名 商品名称 商品价格 数量）\n");
    PRODUCT pro;
    scanf("%s%s%d%d",pro.merchant_name,pro.product_name,&pro.product_val,&pro.product_num);

    MSG msg;
    msg.type = _merchant_add_product;//消息类型为添加商品
    // 把 结构体的字节全部拷贝到消息结构体的数据数组中
    memcpy(msg.data, &pro, sizeof(pro));
    // 把消息发送给服务器
    send(fd, &msg, sizeof(msg), 0);
    // 接受从服务器返回的结果
    recv(fd, &msg, sizeof(msg), 0);
    if (msg.type == _yes)
    {
        printf("添加商品成功！\n");

    }
    else
    {
        printf("添加失败了! 原因是%s\n",msg.data);
        
    }
}
//商家删除商品 通过商家名和商品名删除
void merchant_del_product(int fd){
    printf("请输入要删除商品  的商家名 和 商品名 \n");
    PRODUCT pro;
    scanf("%s%s",pro.merchant_name,pro.product_name);


    MSG msg;
    msg.type = _merchant_del_product; // 消息类型为删除商品
    memcpy(msg.data, &pro, sizeof(pro));
    send(fd, &msg, sizeof(msg), 0);

    recv(fd, &msg, sizeof(msg), 0);
    if (msg.type == _yes)
    {
        printf("删除成功！\n");
    }
    else
    {
        printf("删除失败！\n");
    }
}
//商家修改商品
void merchant_change_product(int fd){
    printf("请输入要修改商品 的 商家名 和 商品名 \n");

    PRODUCT_CHANGE pro;
    scanf("%s%s",pro.merchant_name,pro.product_old_name);

    printf("请输入新的商品信息（商家名 商品名称 商品价格 数量）\n");
    scanf("%s%s%d%d", pro.merchant_name,pro.product_new_name,&pro.product_val,&pro.product_num);

    MSG msg;
    msg.type = _merchant_change_product; // 消息类型为修改商品
    memcpy(msg.data, &pro, sizeof(pro));
    send(fd, &msg, sizeof(msg), 0);

    recv(fd, &msg, sizeof(msg), 0);
    if (msg.type == _yes)
    {
        printf("修改成功！\n");
    }
    else
    {
        printf("修改失败！\n");
    }
}
//商家查询商品
void merchant_find_product(int fd){
    printf("请输入要查询的商家\n");
    PRODUCT pro;
    scanf("%s",pro.merchant_name);

    MSG msg;
    msg.type = _merchant_find_product; // 消息类型为查询商品
    memcpy(msg.data, &pro, sizeof(pro));
    send(fd, &msg, sizeof(msg), 0);

    //循环接收商品列表
     while(1)
     {
          recv(fd,&msg,sizeof(msg),0);
          if(msg.type == over)
          {
               break;
          }
          PRODUCT * product = (PRODUCT *)msg.data;//把消息结构体的地址转为商品结构体
          printf("商家：%s 商品名：%s 商品价格：%d 商品数量：%d \n",product->merchant_name,
          product->product_name,product->product_val,product->product_num);
     }
}